/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.ui;

import fait.ferm.engine.IfaceEngine;
import fait.ferm.engine.ResultEngine;
import fait.ferm.global.Glob;
import fait.ferm.persists.Users;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.GroupBuilder;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.GridPaneBuilder;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.paint.Color;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextBuilder;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 * Класс, описывающий форму создания нового пользователя.
 * @author zx
 */
public class NewUser {

	private Stage newUserStage;
	private Stage parentStage;
	private TextField userTF;
	private PasswordField p1asswordPF;
	private PasswordField p2asswordPF;
	private Label errorMessage;
	Users newUser;
	
	/**
	 *
	 * @param parentStage
	 */
	public NewUser(Stage parentStage) {
		this.parentStage = parentStage;
	}

	/**
	 * Создаем окно для ввода параметров создания нового пользователя. Окно модальное.
	 * @return Возвращается введенный пользователь.
	 */
	public Users newUserForm(){
        Rectangle2D formSize = new Rectangle2D(0, 0, 360, 240);
		newUserStage = new Stage();
		Group rootGroup = null;
		
//создаем основное содержимое формы
		GridPane gridPane = GridPaneBuilder.create()
							.alignment(Pos.CENTER)
							.hgap(10)
							.vgap(10)
							.padding(new Insets(25, 25, 25, 25))
							.build();
		gridPane.add( TextBuilder.create()
						.text("Новый пользователь")
						.build(),
					0,0,2,1	);
		
		userTF = new TextField();
		p1asswordPF = new PasswordField();
		p2asswordPF = new PasswordField();
		gridPane.add( new Label("Имя пользователя:"),0,1);
		gridPane.add( new Label("Пароль:"),0,2);
		gridPane.add( new Label("Повторите пароль:"),0,3);
		gridPane.add( userTF,1,1);
		gridPane.add( p1asswordPF,1,2);
		gridPane.add( p2asswordPF,1,3);
		gridPane.add(HBoxBuilder.create()// 2 кнопки в гориз. бокс
				.alignment(Pos.BOTTOM_RIGHT)
				.spacing(10)
				.children(
					ButtonBuilder.create()
						.text("Создать")
						.onAction(new EventHandler<ActionEvent>() {
							@Override public void handle(ActionEvent t) {
								newUser = doCreate(userTF.getText().trim(), p1asswordPF.getText(), p2asswordPF.getText() );
								if(newUser != null) {
									newUserStage.close();
								}
							}
						})
						.build(),
					ButtonBuilder.create()
						.text("Отмена")
						.onAction(new EventHandler<ActionEvent>() {
							@Override public void handle(ActionEvent t) {
								newUserStage.close();
							}
						})
						.build()
				)
				.build(), 
				0, 4, 2,1);
		errorMessage = LabelBuilder.create()
				.alignment(Pos.CENTER)
				.textFill(Color.RED)
				.textAlignment(TextAlignment.CENTER)
				.text("")
				.build();
		gridPane.add(errorMessage, 0,5,2,1);
//создаем сцену
		Scene scene = SceneBuilder.create()
				.width(formSize.getWidth())
				.height(formSize.getHeight())
				.root(
				  rootGroup = GroupBuilder.create()
					.children(
						RectangleBuilder.create()//для красоты
							.x(1)
							.y(1)
							.width(formSize.getWidth()-2)
							.height(formSize.getHeight()-2)
							.arcWidth(5)
							.arcHeight(5)
							.fill(Color.LIGHTGRAY)
							.stroke(Color.DARKGREY)
							.build(),
						gridPane
					)
					.build()
				)
				.build();
		newUserStage.setScene(scene);
		userTF.requestFocus();		
        newUserStage.initModality(Modality.WINDOW_MODAL);
        newUserStage.initOwner(parentStage);
        newUserStage.initStyle(StageStyle.UNDECORATED);
        newUserStage.showAndWait();
		
        return newUser;
    }
	
	/**
	 * Нажатие на кнопку "Создать". 
	 * При этом проверяются введенные имя пользователя и пароли 
	 * на корректные значения. После этого происходит вызов метода движка 
	 * для создания нового пользователя.
	 * @param un - имя
	 * @param p1 - пароль
	 * @param p2 - повтор пароля
	 * @return Возвращается новый пользователь или null. 
	 */
	private Users doCreate(String un, String p1, String p2){
		if(un.length()>50){
			errorMessage.setText("Длина имени пользователя не должна превышать 50 \nсимволов");
			return null;
		}
		Pattern p = Pattern.compile("\\w+");
		Matcher m = p.matcher(un);
		if(! m.matches()){
			errorMessage.setText("Имя пользователя содержать только \nбуквы, цифры и знак \"_\"");
			return null;			
		}
		if(! p1.equals(p2)){
			errorMessage.setText("Пароли должны совпадать");
			return null;			
		}

		IfaceEngine fe = Glob.getFermEngine();
		ResultEngine res = fe.newUser(un, p1);
		if(res.error.isOk()){
			res = fe.login(un, p1);
			return (Users)res.obj;
		}
		errorMessage.setText(res.error.getMessage());
		return null;
	}
	
}
